Account for trailing / in URLs when determining on-disk location. Fixes #84.
authorBrian Anderson <banderson@mozilla.com>
Sat, 28 Jun 2014 22:39:48 +0000 (15:39 -0700)
committerBrian Anderson <banderson@mozilla.com>
Sat, 28 Jun 2014 22:44:11 +0000 (15:44 -0700)
No tests because there's no preexisting network tests.

src/cargo/sources/git/source.rs

index c126fe2b4d8a026533d45d993576661345b86d86..2ecd0bcf14b16a931f994ce3644a7fa7b4689a02 100644 (file)
@@ -67,7 +67,13 @@ fn ident(location: &Location) -> String {
             let last = path.components().last().unwrap();
             str::from_utf8(last).unwrap().to_str()
         }
-        Remote(ref url) => url.path.as_slice().split('/').last().unwrap().to_str()
+        Remote(ref url) => {
+            // Remove the trailing '/' so that 'split' doesn't give us
+            // an empty string, making '../foo/' and '../foo' both
+            // result in the name 'foo' (#84)
+            let path = strip_trailing_slash(url.path.as_slice());
+            path.split('/').last().unwrap().to_str()
+        }
     };
 
     let ident = if ident.as_slice() == "" {
@@ -79,6 +85,14 @@ fn ident(location: &Location) -> String {
     format!("{}-{}", ident, to_hex(hasher.hash(&location.to_str())))
 }
 
+fn strip_trailing_slash<'a>(path: &'a str) -> &'a str {
+    if path.as_bytes().last() != Some(&('/' as u8)) {
+        path.clone()
+    } else {
+        path.slice(0, path.len() - 1)
+    }
+}
+
 impl<'a, 'b> Show for GitSource<'a, 'b> {
     fn fmt(&self, f: &mut Formatter) -> fmt::Result {
         try!(write!(f, "git repo at {}", self.remote.get_location()));